const path = require('path');
const merge = require('webpack-merge').merge;
const webpack = require('webpack');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const commonConfig = require('./webpack.common');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const {CleanWebpackPlugin} = require('clean-webpack-plugin');


const prodConfig = {
  mode: 'production',
  entry: {
    my_app: [
      './src/index.js'
    ]
  },
  output: {
    path: path.resolve(__dirname, 'dist'),
    publicPath: '/',
    filename: '[name].[contenthash].js'
  }, //chunkHash , contentHash 和 热更新冲突，不能同时使用
  module: {
    rules: [
      {
        test: /\.(css|less)$/,
        use: [
          MiniCssExtractPlugin.loader, // css外链不能局部热更新了, 跟react-hot-loader不兼容
          'css-loader',
          'less-loader'
        ]
      }
    ]
  },
  optimization: {
    splitChunks: {
      chunks: 'all',// async 异步代码分割 initial 同步代码分割 all 同步异步分割都开启  表示选择哪些 chunks 进行分割，
      minSize: 20000, // 表示新分离出的chunk必须大于等于minSize，默认为30000，约30kb。
      // minRemainingSize: 0,
      minChunks: 1, // 表示一个模块至少应被minChunks个chunk所包含才能分割。默认为1。
      maxAsyncRequests: 5, // 表示按需加载文件时，并行请求的最大数目。默认为5。
      maxInitialRequests: 3, // 表示加载入口文件时，并行请求的最大数目。默认为3。
      automaticNameDelimiter: '~', // 表示拆分出的chunk的名称连接符。默认为~。如chunk~vendors.js
      // enforceSizeThreshold: 50000,
      cacheGroups: {
        defaultVendors: {
          test: /[\\/]node_modules[\\/]/,
          priority: -10
        },
        default: {
          minChunks: 2,
          priority: -20,
          reuseExistingChunk: true //模块嵌套引入时，判断是否复用已经被打包的模块
        }
      }
    }
  },
  plugins: [
    new MiniCssExtractPlugin({ //开发环境不使用mini-css-extract-plugin 不同的环境配置不同的loader
      filename: '[name].[contenthash].css'
    }),
    new HtmlWebpackPlugin({
      template: './src/template/index.html',
    }),
    new CleanWebpackPlugin(),
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: JSON.stringify(process.env.NODE_ENV)
      }
    })
  ]
}

module.exports = merge(prodConfig, commonConfig);
